#pragma once

#include "../shared/shared_types.h"
#include "../engine/StaticObject.h"
#include "../engine/Unit.h"
#include "../engine/Bullet.h"

using Putin::Vec3f;
using Putin::Player;

class TechBullet;

class TechTank : public Putin::Unit
{
public:
	TechTank();

	virtual ~TechTank(){}
	virtual TechBullet* createBullet()=0;
	std::string getMuzzleEffect(){return mMuzzleEffect;}
	int mHP;

protected:
	std::string mMuzzleEffect;
};


class Leo : public TechTank
{
public:

	Leo(Vec3f pos, Vec3f facing, Player* p);
	TechBullet* createBullet();
};


class Archer : public TechTank
{
public:

	Archer(Vec3f pos, Vec3f facing, Player* p);
	TechBullet* createBullet();
};


class Truck : public TechTank
{
public:

	Truck(Vec3f pos, Vec3f facing, Player* p);
	TechBullet* createBullet();
};

// Red Definitions of each


class RedLeo : public Leo
{
public:

	RedLeo(Vec3f pos, Vec3f facing, Player* p);
};

class RedArcher : public Archer
{
public:

	RedArcher(Vec3f pos, Vec3f facing, Player* p);
};

class RedTruck : public Truck
{
public:

	RedTruck(Vec3f pos, Vec3f facing, Player* p);
};


/*!
 * A stone for use as an obstacle
 */
class Stone : public Putin::StaticObject
{
public:

	Stone(Vec3f pos, Vec3f facing);
};

class TechBullet : public Putin::Bullet
{
public:

	TechBullet()
	{
		mDamage = 1;
	}

	int mDamage;
};


// Bullets

class GranadeBullet : public TechBullet
{
public:

	GranadeBullet(Vec3f pos, Vec3f target, int owner);

};

class RegularBullet : public TechBullet
{
public:

	RegularBullet(Vec3f pos, Vec3f target, int owner);
};


class SmallBullet : public TechBullet
{
public:

	SmallBullet(Vec3f pos, Vec3f target, int owner);

};